package org.xems.net
{
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	
	import org.xems.display.ILoaderSkin;
	import org.xems.utils.MathUtil;

	/**
	 * 
	 * @author qixiaowei
	 * 
	 */
	public class LoaderMission
	{
		/**
		 * 加载显示对象，以Loader方式下载，该方式可以存在于缓存，减少流量消耗成本
		 */
		public static const LOAD_DISPLAY_TYPE:String = "loadDisplayType";
		/**
		 * 加载二进制数据，不论是二进制还是文本，均使用 URLLoaderDataFormat.BINARY 形式下载
		 */
		public static const LOAD_BYTES_TYPE:String = "loadBytesType";
		
		public var name:String;
		public var url:String;
		public var type:String;
		/**
		 * 当加载时，可能会是URLLoader对象，
		 * 也有可能是Loader对象，
		 * 也可以不传这个对象过来。
		 */
		public var loader:* = null;
		/**
		 * 加载完成后，给的结果
		 */
		public var data:*;
		/**
		 * Loader进制显示对象
		 */
		public var loaderSkin:ILoaderSkin;
		public var startCallback:Function;
		public var progressCallback:Function;
		public var completeCallback:Function;
		public var failCallback:Function;
		
		private var _bytesLoaded:uint = 0;
		private var _bytesTotal:uint = 0;
		
		public var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null);
		
		/**
		 * 加载的百分比，
		 * 大多数会使用这个属性
		 * @return 
		 * 
		 */
		public function get percent():uint
		{
			return MathUtil.getPercent(bytesLoaded, bytesTotal);
		}

		/**
		 * 已经加载字节数
		 */
		public function get bytesLoaded():uint
		{
			return _bytesLoaded;
		}

		/**
		 * @private
		 */
		public function set bytesLoaded(value:uint):void
		{
			_bytesLoaded = value;
			if(loaderSkin){
				loaderSkin.bytesLoaded = _bytesLoaded;
				loaderSkin.percent = this.percent;
			}
		}

		/**
		 * 共需加载的字节数
		 */
		public function get bytesTotal():uint
		{
			return _bytesTotal;
		}

		/**
		 * @private
		 */
		public function set bytesTotal(value:uint):void
		{
			_bytesTotal = value;
			if(loaderSkin){
				loaderSkin.bytesTotal = _bytesTotal;
			}
		}


		public function LoaderMission(name:String, url:String, type:String = LOAD_DISPLAY_TYPE)
		{
			this.name = name;
			this.url = url;
			this.type = type;
		}
	}
}